<?php
class Prov_proveedores extends Personas {

	public function __construct()
    {
    	# Al constructor le envío la clase Controlador, y el nombre de la entidad gestionada
    	parent::__construct(get_class($this), 'Proveedores :: Proveedores', 'Proveedor', 'Proveedores');
	}

	public function ver_todos($dataView = array())
	{
		$dataView['solo_proveedores'] = TRUE;
		parent::ver_todos($dataView);
	}

	public function generar_excel()
	{
		$dataView['solo_proveedores'] = TRUE;
		parent::generar_excel($dataView);
	}

	/** Llamada desde AJAX para mostrar un resumen de un objeto. Se sobreescribe el método heredado
	para darle un comportamiento particular. */
	public function toString($id_elemento, $datos = '', $objEntidad = NULL)
	{
		parent::toStringPersona(TRUE, $id_elemento, $datos, $objEntidad);
	}

	/** Llamada desde AJAX para mostrar un resumen de un objeto. Se sobreescribe el método heredado
	para darle un comportamiento particular. */
	public function cargarSegunFiltro($nombre, $codigo)
	{
		parent::cargarSegunFiltroPersona(TRUE, $nombre, $codigo);
	}

	/* Filtra los datos y devuelve sólo código y nombre. IMPRIME el resultado con JSON, para AJAX */
	public function busqueda_rapida()
	{
		parent::busqueda_rapidaPersona(TRUE);
	}

	/* Carga todos los registros de un modelo o entidad (de acuerdo a los filtros o los últimos agregados) */
	public function busqueda()
	{
		parent::busquedaPersona(TRUE);
	}

	public function importar_lp($id_elemento){
		$dataView['objEntidad'] = $this->getObjeto($id_elemento);
		$dataView['title'] = 'Actualizar Precios a partir de una Lista';
		$dataView['pagina_editar'] = 'proveedores/proveedor_importar_lp_edit_view';
		$dataView['nombre_controlador'] = '';
		$dataView['metodo_guardar'] = '';
		$dataView['noMostrarTitulo'] = TRUE;
		$dataView['id_entidad'] = $id_elemento;

		// Notifico si existe alguna configuración de importación cargada para el proveedor
		 $dataView['config_cargada'] = $this->getConfiguracionImportacion($id_elemento)->exists();

		$path = strtolower($this->nombre_controlador) . "/" . 'actualizar_precios';
		$datos = "{'txt_id': $('#txt_id').val(), 'chk_tieneCabeceras': $('#chk_tieneCabeceras').val(), 'chk_usarConfig': $('#chk_usarConfig').val(), 'chk_ignorarCero': $('#chk_ignorarCero').val(), 'chk_soloActivos': $('#chk_soloActivos').val()}";
		$dataView['metodo_subir_archivo'] = "cargarArchivo('$path', 'resultado_importacion', $datos)";

		parent::_loadFileUploadView($dataView, FALSE);
	}

	private function getConfiguracionImportacion($idProveedor) {
		$objConfig = new Conf_importar_Excel();
		$objConfig->where('persona_id', $idProveedor);
		$objConfig->get(1);

		return $objConfig;
	}

	public function actualizar_precios() {
		// Intento guardar el archivo si hubiera
		$config['upload_path'] = './documentos/temporales';
		$config['allowed_types'] = 'xls|xlsx';
		
		$this->load->library('upload', $config);
		if (!$this->upload->do_upload()) {
			echo 'Error: ' . $this->upload->display_errors();
		}
		else {
			$datos_archivo = $this->upload->data();
			$path_archivo = $datos_archivo['full_path'];
			
			$idProveedor = is_numeric($this->input->post('txt_id')) ? $this->input->post('txt_id') : NULL;
			$tieneCabeceras = $this->input->post('chk_tieneCabeceras');
			$usarConfig = $this->input->post('chk_usarConfig');
			$ignorarCeroOVacio = $this->input->post('chk_ignorarCero');
			$soloActivos = $this->input->post('chk_soloActivos');

			$this->load->library('to_excel');
			$objPHPExcel = $this->to_excel->cargarExcel($path_archivo);

			// Por defecto, si no se configura otra cosa, se consideran las 3 primeras columnas
			$col_codigo = 0;
			$col_pesos = 1;
			$col_dolares = 2;
			$filaInicio = 1;
			if($usarConfig) {
				$objConfig = $this->getConfiguracionImportacion($idProveedor);
				if($objConfig->exists() > 0) {
					// Existe configuración para el proveedor
					if(!empty($objConfig->col_codigo)) $col_codigo = PHPExcel_Cell::columnIndexFromString($objConfig->col_codigo) - 1;
					if(!empty($objConfig->col_importe_pesos)) $col_pesos = PHPExcel_Cell::columnIndexFromString($objConfig->col_importe_pesos) - 1;
					if(!empty($objConfig->col_importe_dolares)) $col_dolares = PHPExcel_Cell::columnIndexFromString($objConfig->col_importe_dolares) - 1;
					if(is_numeric($objConfig->cant_filas_cabecera)) $filaInicio += $objConfig->cant_filas_cabecera;
				}
				else { if($tieneCabeceras) $filaInicio++; }
			}
			else { if($tieneCabeceras) $filaInicio++; }

			$cantActualizaciones = 0;
			$cantProductoTotal = 0;
			$detalle_no_actualizados = "";
			// Las filas comienzan desde el índice 1. Las columnas desde 0
			$cantFilas = $objPHPExcel->getActiveSheet()->getHighestRow();
			for($fila = $filaInicio; $fila <= $cantFilas; $fila++){
				$valor_codigo = $objPHPExcel->getActiveSheet()->getCellByColumnAndRow($col_codigo,$fila)->getFormattedValue();
				$valor_pesos = $objPHPExcel->getActiveSheet()->getCellByColumnAndRow($col_pesos,$fila)->getFormattedValue();
				$valor_dolares = $objPHPExcel->getActiveSheet()->getCellByColumnAndRow($col_dolares,$fila)->getFormattedValue();

				if(!empty($valor_codigo)) { 
					if(!$ignorarCeroOVacio || ($ignorarCeroOVacio && (!empty($valor_pesos) || !empty($valor_dolares)))) {

						$objProvProd = new Prod_proveedor_producto();
						$objProvProd->where('persona_id', $idProveedor);
						$objProvProd->where('codigo', $valor_codigo);
						if($soloActivos) $objProvProd->where_related_prod_producto('baja', FALSE);
						$objProvProd->get(1);
						if($objProvProd->exists()) {
							$cantProductoTotal++;

							// Encontró el producto según el código de producto del proveedor
							$campos_actualizar = array();
							if(!empty($valor_pesos) && is_numeric($valor_pesos)) $campos_actualizar['importe_pesos'] = $valor_pesos;
							else { if(!$ignorarCeroOVacio) $campos_actualizar['importe_pesos'] = 0; }
							
							if(!empty($valor_dolares) && is_numeric($valor_dolares)) $campos_actualizar['importe_dolares'] = $valor_dolares;
							else { if(!$ignorarCeroOVacio) $campos_actualizar['importe_dolares'] = 0; }

							$campos_actualizar['fecha_actualizacion'] = date($this->formatoFechaGuardar);
							$objProvProd->where(array('persona_id' => $idProveedor, 'codigo' => $valor_codigo))->update($campos_actualizar);
							$filas_afectadas = $objProvProd->db->affected_rows();
							$cantActualizaciones += $filas_afectadas;

							if($filas_afectadas == 0 || !$filas_afectadas) $detalle_no_actualizados .= '</br>No se pudo actualizar: ' . $valor_codigo;
						}
						else $detalle_no_actualizados .= '<br/>Producto no encontrado o dado de baja. Código: ' . $valor_codigo;
					}
				}
			}

			echo "<div class='box_busqueda' style='height:300px; overflow: auto'>Proceso completo. De un total de $cantProductoTotal posibles actualizaciones, se realizaron $cantActualizaciones correctas.";
			if (!empty($detalle_no_actualizados)) echo "<br/><br/>DETALLE DE PRODUCTOS NO ACTUALIZADOS$detalle_no_actualizados";
			echo "<div>";

			# Elimino el archivo de prueba utilizado
			if (file_exists($path_archivo)){
				unlink($path_archivo);
			}
		}
	}

	protected function setAyuda($dataView) {
		$dataView['ayuda_explicación_adicional'] = 'Además de la funcionalidad mencionada arriba, se puede realizar la actualización de precios 
													de todos los productos de un determinado proveedor a partir de una lista de precios en formato 
													Excel a través del botón ' . $this->extras_form->generalButton('', '', "L. Precios", 'Importar Lista de Precios', 'fa fa-list-ol', TRUE) . '.</br> 
													Para ello se recomienda realizar la configuración de importación de listas de precios en la 
													sección de configuración del sistema.';

		return parent::setAyuda($dataView);
	}
}